Giới thiệu về PyTorch: Vì sao Tensor lại quan trọng
PyTorch là một khung phần mềm mã nguồn mở linh hoạt và động, được ưa chuộng trong nghiên cứu học sâu và phát triển nhanh. Ở cốt lõi của nó là Tensor là cấu trúc dữ liệu không thể thiếu. Nó là một mảng đa chiều được thiết kế để xử lý hiệu quả các thao tác số học cần thiết cho mô hình học sâu, hỗ trợ tính năng tăng tốc GPUtăng tốc GPU một cách tự động.
1. Hiểu cấu trúc Tensor
Mọi đầu vào, đầu ra và tham số mô hình trong PyTorch đều được bao bọc trong một Tensor. Chúng có chức năng tương tự như mảng NumPy nhưng được tối ưu để xử lý trên các thiết bị chuyên dụng nhưGPU, giúp chúng hiệu quả hơn rất nhiều đối với các phép toán đại số tuyến tính quy mô lớn mà mạng nơ-ron yêu cầu.
Các thuộc tính chính xác định Tensor:
- Hình dạng: Xác định kích thước dữ liệu, được biểu diễn dưới dạng bộ (ví dụ: $4 \times 32 \times 32$ cho một tập ảnh).
- Kiểu dữ liệu: Xác định kiểu số của các phần tử được lưu trữ (ví dụ:
torch.float32cho trọng số mô hình,torch.int64cho chỉ mục). - Thiết bị: Chỉ vị trí phần cứng vật lý: thường là
'cpu'hoặc'cuda'(GPU NVIDIA).
Đồ thị động và Autograd
PyTorch sử dụng mô hình thực thi mệnh lệnh, nghĩa là đồ thị tính toán được xây dựng khi các thao tác được thực hiện. Điều này cho phép công cụ đạo hàm tự động tích hợp sẵn, Autograd, để theo dõi mọi thao tác trên Tensor, miễn là thuộc tính
requires_grad=True được thiết lập, cho phép tính toán gradient một cách dễ dàng trong quá trình truyền ngược.
THƯỜNG TRÌNHbash — pytorch-env
> Đã sẵn sàng. Nhấn "Chạy" để thực thi.
>
TRÌNH KIỂM TRA TENSOR Trực tiếp
Chạy mã để kiểm tra các Tensor đang hoạt động
Câu hỏi 1
Lệnh nào tạo ra một tensor $5 \times 5$ chứa các số ngẫu nhiên theo phân bố đều từ 0 đến 1?
Câu hỏi 2
Nếu tensor $A$ nằm trên CPU, và tensor $B$ nằm trên thiết bị CUDA, điều gì xảy ra nếu bạn cố gắng tính $A + B$?
Câu hỏi 3
Loại dữ liệu (dtype) phổ biến nhất dùng cho trọng số mô hình và các phép tính trung gian trong học sâu là gì?
Thử thách: Biến đổi Tensor và Hình dạng
Chuẩn bị một tensor cho một phép toán ma trận cụ thể.
Bạn có một vector đặc trưng $F$ với hình dạng $(10,)$. Bạn cần nhân nó với một ma trận trọng số $W$ có hình dạng $(10, 5)$. Để phép nhân ma trận (MatMul) hoạt động, $F$ phải là 2 chiều.
Bước 1
Hình dạng của $F$ nên là gì trước khi nhân với $W$?
Giải pháp:
Các chiều bên trong phải khớp, do đó $F$ phải là $(1, 10)$. Sau đó $(1, 10) @ (10, 5) \rightarrow (1, 5)$.
Mã:
Các chiều bên trong phải khớp, do đó $F$ phải là $(1, 10)$. Sau đó $(1, 10) @ (10, 5) \rightarrow (1, 5)$.
Mã:
F_new = F.unsqueeze(0) hoặc F_new = F.view(1, -1)Bước 2
Thực hiện phép nhân ma trận giữa $F_{new}$ và $W$ (hình dạng $(10, 5)$).
Giải pháp:
Thao tác là phép nhân ma trận đơn giản.
Mã:
Thao tác là phép nhân ma trận đơn giản.
Mã:
output = F_new @ W hoặc output = torch.matmul(F_new, W)Bước 3
Phương thức nào trả về một tensor với kích thước đã chỉ định rõ ràng, cho phép bạn làm phẳng tensor trở lại thành $(50,)$? (Giả sử ban đầu $F$ là $(5, 10)$ và giờ đã được làm phẳng.)
Giải pháp:
Dùng phương thức
Mã:
Dùng phương thức
view hoặc reshape để làm phẳng. Cách nhanh nhất thường là dùng -1 cho một chiều.Mã:
F_flat = F.view(-1) hoặc F_flat = F.reshape(50)